보안·인증 용어
인증과 인가, 토큰, mTLS, HMAC, 키 관리 등 보안 용어
- 용어 16개
authentication / authorization (인증 / 인가)
인증은 “너는 누구인가”를 확인하는 것, 인가는 “그 사람이 이것을 해도 되는가”를 확인하는 것.
API key
미리 발급한 고정 키를 요청 헤더에 넣어 보내는 인증 방식.
- 간단한 서버 간 인증에 쓴다. 키 자체가 요청에 실려 가서 탈취되면 끝이다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
OAuth2
비밀번호를 넘기지 않고 권한을 위임해 access token을 발급받는 인증·인가 표준.
- 제3자 앱 연동(“○○로 로그인”)에 쓴다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS · 소셜로그인 전 과정
access token / JWT
access token은 권한을 증명하는 짧은 수명의 토큰, JWT(JSON Web Token)는 서명이 들어 있어 서버가 DB 조회 없이 검증할 수 있는(self-contained) 토큰 형식.
- 사용자 세션, 서비스 간 사용자 정보 전달에 쓴다. 발급 후에는 내용을 바꿀 수 없지만 폐기하기 어렵다는 단점이 있다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
mTLS (mutual TLS)
서버뿐 아니라 클라이언트도 인증서로 신원을 증명하는 TLS.
- 서비스 간 통신, 금융 대외 연동처럼 양쪽을 모두 확인해야 할 때 쓴다. 일반 TLS는 서버만 인증한다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS · 04. Netty 소켓 파이프라인 SSL-TLS 적용과 mTLS 상호 인증 (SslHandler, KeyStore, SslContext)
HMAC (Hash-based Message Authentication Code)
공유된 비밀키와 메시지를 함께 해시해서 서명을 만드는 방식.
- 보내는 쪽:
signature = HMAC-SHA256(secret, 본문 + timestamp)를 헤더에 실어 보낸다. 받는 쪽: 같은 secret으로 직접 계산해 비교한다. - 보장하는 것: 메시지가 중간에 바뀌지 않았다(무결성), secret을 아는 상대가 보냈다(인증). 암호화는 아니어서 본문은 그대로 보인다.
- API key와 달리 secret이 네트워크에 실리지 않고 서명만 실린다. timestamp를 넣으면 재전송 공격(replay)도 막을 수 있다. 예) 웹훅 서명, AWS SigV4.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
replay attack (재전송 공격)
가로챈 정상 요청을 그대로 다시 보내 공격하는 것.
- timestamp, nonce(한 번만 쓰는 값)를 서명에 넣어 막는다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
encryption / hashing / signature (암호화 / 해싱 / 서명)
암호화는 키로 복호화할 수 있게 숨기는 것, 해싱은 되돌릴 수 없는 고정 길이 값으로 바꾸는 것, 서명은 누가 보냈고 바뀌지 않았음을 증명하는 것.
- 비밀번호는 암호화가 아니라 해싱해서 저장한다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS · 2-3. 암호화 계열
symmetric / asymmetric encryption (대칭키 / 비대칭키)
대칭키는 암호화와 복호화에 같은 키 하나를 쓰는 방식, 비대칭키(공개키 암호)는 한 쌍의 서로 다른 키(공개키와 개인키)를 쓰는 방식.
- 대칭키(예: AES)는 빠르지만 키를 상대에게 안전하게 전달해야 하는 문제가 있다. 비대칭키(예: RSA, ECDSA)는 느리지만 이 문제를 풀 수 있다.
- 그래서 TLS는 비대칭키로 키를 교환·인증하고, 실제 데이터는 대칭키로 암호화한다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
public key / private key (공개키 / 개인키)
공개키는 누구에게나 공개해도 되는 키, 개인키는 소유자만 비밀로 보관하는 키. 둘은 수학적으로 한 쌍이다.
- 암호화(기밀성): 공개키로 암호화하면 짝인 개인키로만 복호화할 수 있다. 상대의 공개키로 보내면 상대만 열 수 있다.
- 전자서명(인증, 무결성): 개인키로 서명하면 누구나 공개키로 검증할 수 있다. 서명한 사람이 개인키 소유자이고 내용이 바뀌지 않았음을 증명한다. 방향이 반대인 점이 헷갈리는 부분이다.
- 개인키가 유출되면 신뢰가 무너진다. 공개키는 유출돼도 문제가 없다.
- 예) SSH 키(내 PC의 개인키, 서버
authorized_keys에 공개키 등록), TLS 인증서(서버 공개키 + 신원을 인증기관이 서명), JWT의 RS256 서명. - 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS · 파일 무결성 전자서명 검증 - RSA 개인키 서명과 공개키 검증(사이드카 방식) 정리
certificate (인증서)
공개키와 소유자 정보를 묶어 인증기관(CA)이 서명한 문서.
- “이 공개키는 정말 이 도메인의 것이다”를 보증한다. HTTPS에서 브라우저가 서버를 믿는 근거다. mTLS에서는 클라이언트도 인증서를 낸다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
whitelist / allowlist
허용할 대상(IP, 경로, 호출자)만 목록으로 적어 두고 나머지는 막는 방식.
- IP whitelist는 외부 연동사의 접근 가능 IP를 제한한다. 요즘은 allowlist라고도 부른다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
key rotation (키 교체)
암호화 키를 주기적으로 새 버전으로 바꾸는 것.
- 키 저장소(AWS KMS, HashiCorp Vault, HSM)는 키를 안전하게 보관하는 곳이고, key rotation 라이브러리(예: Google Tink)는 애플리케이션이 여러 버전의 키를 다루는 로직을 맡는다.
- 암호문 앞에 키 버전을 붙여 저장하고, 암호화는 항상 최신 키로, 복호화는 암호문에 적힌 버전의 키로 한다. 그래야 옛 키로 암호화한 데이터도 계속 읽힌다.
- 그다음 옛 데이터를 새 키로 재암호화(migration)한 뒤 옛 키를 폐기한다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS
PII (개인정보) / 마스킹
개인을 식별할 수 있는 정보(이름, 연락처, 카드번호 등).
- 로그, 외부 연동 시 그대로 노출하지 않는다. 외부에는 내부 유저 ID 대신 해시나 UUID로 만든 별도 키를 준다.
- 학습 노트: 인증·인가 방식 비교 - API Key·OAuth2·JWT·HMAC·mTLS · 제로 디펜던시 개인정보 마스킹과 오류 핑거프린팅(SHA-256) 모니터링 설계
CAfile / CApath (OpenSSL의 CA 지정)
신뢰할 CA 인증서를 지정하는 두 방식. CAfile은 PEM 파일 하나(안에 여러 CA 가능), CApath는 디렉터리.
CApath의 파일 이름은 CA 주체 이름의 해시값이어야 하고,c_rehash로 해시 링크를 만든다. 파일만 복사하면 OpenSSL이 그 CA를 찾지 못한다.- 검색 순서는
CAfile, 그다음CApath다. - 학습 노트: OpenSSL로 mTLS 컨텍스트 만들기 — 인증서·CA·검증·ALPN·논블로킹
hostname verification (호스트명 검증)
서버 인증서의 이름(SAN, 없으면 CN)이 접속하려는 호스트명과 맞는지 확인하는 단계.
- 지정하지 않으면 “믿는 CA가 발급했는가”만 검사되어, 다른 서버의 유효한 인증서도 통과할 수 있다.
- OpenSSL에서는 기대하는 호스트명을 지정해야 검사된다(
X509_VERIFY_PARAM_set1_host). - 학습 노트: OpenSSL로 mTLS 컨텍스트 만들기 — 인증서·CA·검증·ALPN·논블로킹